package com.su.sweet.controller;

import com.su.sweet.model.SRoleMenu;
import com.su.sweet.service.ISRoleMenuService;
import org.noear.solon.annotation.*;
import org.noear.solon.core.handle.Context;
import org.noear.solon.core.handle.Result;

import java.time.LocalDateTime;
import java.util.List;

@Controller
@Mapping("/sRoleMenu")
public class SRoleMenuController {
    @Inject
    private ISRoleMenuService roleMenuService;

    /**
     * 为角色分配单个菜单
     * @param ctx 请求上下文
     * @param roleMenu 角色菜单关联信息，需包含roleId和menuId
     * @return 操作结果，包含成功/失败状态
     * @apiNote 示例请求：
     * POST /sRoleMenu/assign
     * {
     *   "roleId": 1,
     *   "menuId": 2
     * }
     */
    @Post
    @Mapping("/assign")
    public Result assignMenu(Context ctx, SRoleMenu roleMenu) {
        roleMenu.setCreateTime(LocalDateTime.now());
        roleMenu.setCreateUser(Long.valueOf(ctx.header("userId")));
        return Result.succeed(roleMenuService.save(roleMenu));
    }

    /**
     * 移除角色的单个菜单关联
     * @param roleMenuId 角色菜单关联ID
     * @return 操作结果，包含成功/失败状态
     * @apiNote 示例请求：
     * DELETE /sRoleMenu/remove?roleMenuId=1
     */
    @Delete
    @Mapping("/remove")
    public Result removeMenu(Long roleMenuId) {
        return Result.succeed(roleMenuService.removeById(roleMenuId));
    }

    /**
     * 批量更新角色菜单关联（先删除原有关联再创建新关联）
     * @param ctx 请求上下文
     * @param roleId 角色ID
     * @param menuIds 菜单ID列表
     * @return 操作结果，包含成功/失败状态
     * @apiNote 示例请求：
     * POST /sRoleMenu/batchUpdate
     * {
     *   "roleId": 1,
     *   "menuIds": [2, 3, 4]
     * }
     */
    @Post
    @Mapping("/batchUpdate")
    public Result batchUpdate(Context ctx, @Body BatchUpdateRequest request) {
        return Result.succeed(roleMenuService.updateRoleMenus(
                request.getRoleId(),
                request.getMenuIds(),
                Long.valueOf(ctx.header("userId"))));
    }

    /**
     * 批量更新请求参数类
     */
    public static class BatchUpdateRequest {
        private Long roleId;
        private List<Long> menuIds;

        // getters and setters
        public Long getRoleId() {
            return roleId;
        }

        public void setRoleId(Long roleId) {
            this.roleId = roleId;
        }

        public List<Long> getMenuIds() {
            return menuIds;
        }

        public void setMenuIds(List<Long> menuIds) {
            this.menuIds = menuIds;
        }
    }

    /**
     * 查询角色拥有的菜单列表
     * @param roleId 角色ID
     * @return 操作结果，包含角色菜单关联列表
     * @apiNote 示例请求：
     * GET /sRoleMenu/roleMenus?roleId=1
     */
    @Get
    @Mapping("/roleMenus")
    public Result getRoleMenus(Long roleId) {
        return Result.succeed(roleMenuService.lambdaQuery()
                .eq(SRoleMenu::getRoleId, roleId)
                .list());
    }

    /**
     * 查询拥有该菜单的角色列表
     * @param menuId 菜单ID
     * @return 操作结果，包含菜单角色关联列表
     * @apiNote 示例请求：
     * GET /sRoleMenu/menuRoles?menuId=2
     */
    @Get
    @Mapping("/menuRoles")
    public Result getMenuRoles(Long menuId) {
        return Result.succeed(roleMenuService.lambdaQuery()
                .eq(SRoleMenu::getMenuId, menuId)
                .list());
    }
}
